home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-68k-src / machines / amiga68k / libsrc / stdlib / strtoul.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  1KB  |  56 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <errno.h>
  4. #include <limits.h>
  5. #include <stdlib.h>
  6.  
  7. unsigned long strtoul(const char *nptr,char **endptr,int base)
  8. { const char *p=nptr,*q;
  9.   char c=0;
  10.   unsigned long r=0;
  11.   if(base<0||base==1||base>36)
  12.   { if(endptr!=NULL)
  13.       *endptr=(char *)nptr;
  14.     return 0;
  15.   }
  16.   while(isspace(*p))
  17.     p++;
  18.   if(*p=='-'||*p=='+')
  19.     c=*p++;
  20.   if(base==0)
  21.   { if(p[0]=='0')
  22.     { if(tolower(p[1])=='x'&&isxdigit(p[2]))
  23.       { p+=2;
  24.         base=16; }
  25.       else
  26.         base=8;
  27.     }else
  28.       base=10;
  29.   }
  30.   q=p;
  31.   for(;;)
  32.   { int a;
  33.     if(!isalnum(*q))
  34.       break;
  35.     a=isdigit(*q)?*q-'0':tolower(*q)-('a'-10);
  36.     if(a>base)
  37.       break;
  38.     if(r>(ULONG_MAX-a)/base||r*base>ULONG_MAX-a)
  39.     { errno=ERANGE; /* overflow */
  40.       r=ULONG_MAX; }
  41.     else
  42.       r=r*base+a;
  43.     q++;
  44.   }
  45.   if(q==p) /* Not a single number read */
  46.   { if(endptr!=NULL)
  47.       *endptr=(char *)nptr;
  48.     return 0;
  49.   }
  50.   if(c=='-')
  51.     r=-r;
  52.   if(endptr!=NULL)
  53.     *endptr=(char *)q;
  54.   return r;
  55. }
  56.